跳到主要内容

Unity 常用的工具类

获取时间的方式

使用 System 提供的工具类

// 获取系统时间
Debug.Log(System.DateTime.Now); // 当前本地时间 (年月日时分秒) -- 10/4/2018 9:38:19 PM
Debug.Log(System.DateTime.UtcNow); // 当前世界时间 (年月日时分秒) -- 10/4/2018 1:38:19 PM
Debug.Log(System.DateTime.Now.Year); // 当前时间 (年)
Debug.Log(System.DateTime.Now.Month); // 当前时间 (月)
Debug.Log(System.DateTime.Now.Day); // 当前时间 (日)
Debug.Log(System.DateTime.Now.Hour); // 当前时间 (时)
Debug.Log(System.DateTime.Now.Minute); // 当前时间 (分)
Debug.Log(System.DateTime.Now.Second); // 当前时间 (秒)

Unity 提供的 Time 工具类

// 表示从游戏开发到现在的时间,会随着游戏的暂停而停止计算。
Time.time

// 表示从当前Scene开始到目前为止的时间,也会随着暂停操作而停止。
Time.timeSinceLevelLoad

// 表示从上一帧到当前帧时间,以秒为单位。
Time.deltaTime

//计时器通过这个使用,update里把Time.deltaTime累加起来,就是经过的时间
// 表示以秒计游戏开始的时间,固定时间以定期间隔更新(相当于fixedDeltaTime)直到达到time属性。
Time.fixedTime

// 表示以秒计间隔,在物理和其他固定帧率进行更新,在Edit->ProjectSettings->Time的Fixed Timestep可以自行设置。
Time.fixedDeltaTime

// 表示一个平稳的 deltaTime,根据前 N帧的时间加权平均的值。
Time.SmoothDeltaTime

// 时间缩放,默认值为1,若设置<1,表示时间减慢,若设置>1,表示时间加快,可以用来加速和减速游戏,非常有用。
Time.timeScale

// 总帧数
Time.frameCount

// 表示自游戏开始后的总时间,即使暂停也会不断的增加。
Time.realtimeSinceStartup

// 表示设置每秒的帧率,然后不考虑真实时间。
Time.captureFramerate

// 不考虑timescale时候与deltaTime相同,若timescale被设置,则无效。
Time.unscaledDeltaTime

制作一个计时器

void Update()
{
gameTime += Time.deltaTime;
UIManager.UpdateTimeUI(gameTime);
}

public void GetTime(float timeCount)
{
int minute = (int) (timeCount / 60);
float seconds = timeCount % 60;
// 可以通过 minute.ToString("00") 让它显示两位数
Debug.Log(minute.ToString("00") + ":" + seconds.ToString("00"));
}

显示效果:

Unity 的 Utility

参考资料 来说说Unity中的那些Utility和Helper们

JsonUtility

JsonUtility —— 负责 Json 文件的序列化和反序列化。主要有以下三个方法:

//从object序列化为json字符串
JsonUtility.ToJson(_class1);
//从json字符串反序列化为object
JsonUtility.FromJson<TestClass1>(_jsonStr);
//此方法与JsonUtility.FromJson非常相似,不同之处在于,
//它不是创建新对象并将JSON数据加载到其中,而是将JSON数据加载到现有对象中。
//这使您无需任何分配即可更新存储在类或对象中的值
JsonUtility.FromJsonOverwrite(_jsonStr,this);

可以序列化的类只包括 MonoBehaviour,ScriptableObject 或应用了 Serializable 属性的普通类/结构。不支持的字段将被忽略,私有字段,静态字段和应用了 NonSerialized 属性的字段也会被忽略。例如自定义的类需要加上 [Serializable]

EditorUtility

EditorUtility —— 主要负责编辑器的一些与对话框相关的操作。它的方法挺多,一般会用到下面几个:

//显示进度条
EditorUtility.DisplayProgressBar("标题", "进度条内容", progress / secs);
//关闭进度条
EditorUtility.ClearProgressBar();
//标准对话框
EditorUtility.DisplayDialog("标题","询问?", "确定", "取消");

此外还可以在组件之间复制序列化值,打开文件面板等。具体可参看文档。

GameObjectUtility

//移除丢失的脚本
GameObjectUtility.RemoveMonoBehavioursWithMissingScript()

颜色转换

ColorUtility —— 在 HtmlStringRGB 和 UnityColor 之间进行转换。

//UnityColor -> HtmlColor
string colorStr = ColorUtility.ToHtmlStringRGB (Color.green);
string colorStr = ColorUtility.ToHtmlStringRGBA (Color.green);
//HtmlColor(十六进制颜色,注意以#开头) -> UnityColor
ColorUtility.TryParseHtmlString ("#FFFFFFFF", out c);


Color nowColor;
ColorUtility.TryParseHtmlString("#FECEE1", out nowColor);

Color的静态方法:

//HSV->RGB
Color color = Color.HSVToRGB(1,1,1);
//RGB->HSV
Color.RGBToHSV(Color.white,out float h,out float s,out float v);

图片转换

Texture2D texture2D = new Texture2D (1, 1);
byte[] bytes = ImageConversion.EncodeToPNG (texture2D);
ImageConversion.LoadImage (texture2D, bytes);